package com.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @author zxl
 * @create :2022/9/28
 */
/*写一个类 各类继承自HTTPServlet 会自动执行Service方法并且传入 请求和响应的对象*/

public class BaseServlet extends HttpServlet {
    //自动执行的 并且按照请求方式进行doGet和doPost的分发
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //获取普通servlet类的Class对象 然后根据请求的地址判断是做什么功能 然后调用不同的方法

        //1.获取路径   xxx/student/add   xxx/student/delete
        String requestURI = req.getRequestURI();// 为/web13_demo/student/add
        //2.根据路径获取到要执行的Servlet方法
        //最后一个/后面的就是要执行的方法
        //获取最后一个/的位置
        int i = requestURI.lastIndexOf('/');
        //截取 不能包含/ 从/后一位开始截取
        String substring = requestURI.substring(i + 1);
        System.out.println("substring = " + substring);

        //获取当执行不同操作时的方法名后 根据方法执行
        System.out.println("this = " + this);
        //获取当前访问的子类Servlet的字节码Class对象
        Class<? extends BaseServlet> c = this.getClass();
        //获取字节码对象所有类的方法 参数  方法名  参数
        try {
            Method method = c.getMethod(substring, HttpServletRequest.class, HttpServletResponse.class);
            //调用该方法
            method.invoke(this, req, resp);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }


    }

}
